﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//问题1 : 这个Load的泛型和非泛型方法有什么区别?
//答 : 泛型的Load可以指定加载特定类型的资源 , 返回值也是这个类型 , 而非泛型的Load加载和返回的都是Object , 这个就涉及拆装箱的问题 , 会造成资源浪费
//问题2 : 回调函数是不是指协程执行完后执行的委托?
//问题3 : 这个unityAction为什么也要用泛型?

///<summary>
///
///</summary>
public class ResManager : BaseManager<ResManager>
{
    //封装同步加载
    public T Load<T>(string name) where T : Object
    {
        T res = Resources.Load<T>(name);
        if (res is GameObject)
        {
            return GameObject.Instantiate(res);
        }
        else
            return res;
    }

    //封装异步加载
    //异步加载是没有不能有返回值的 , 因为是用协程实现的 , 协程通常都不能有返回值
    public void LoadAsync<T>(string name , UnityAction<T> callback) where T : Object
    { //不能直接开启协程 , 因为协程是unity提供的方法 , 只有继承mono的脚本才能使用协程 , 那么我们就用到了monoManager了 , 这个monoManager是框架里唯一继承了mono的脚本 , 可以接收委托 , 然后把接收到的函数加入Update或者开启协程.
        MonoManager.GetInstance().StartCoroutine(RealLoadAsync(name, callback));
    }
    //真正的协程 用于开启异步加载资源
    private IEnumerator RealLoadAsync<T>(string name , UnityAction<T> callback) where T:Object
    {
        ResourceRequest r = Resources.LoadAsync<T>(name);
        yield return r; //这意思是直到r返回1才进行下边的语句?
        if (r.asset is GameObject)
        {
            callback(GameObject.Instantiate(r.asset as T)); //这个callback就是个有参无返回值的函数 , 因为UnityAction声明的委托只能传入无返回值有参函数 , 所以说callback就是个传进来的函数而已
            //上面这句话就是 , 如果这个加载出来的资源是GameObject的话就调用这个callback函数 , 这个函数也是传进来的 , 大概就是doSomething , 其实是就算是做什么都行 , 这个函数的参数必须是GameObject , 因为
        }
        else
        {
            callback(r.asset as T);
        }
    }

 }

